# 日志系统工具类
import os
import logging
import logging.handlers
from datetime import datetime
from settings import LOG_SETTINGS, BASE_DIR

class GUILogHandler(logging.Handler):
    """GUI日志处理器"""
    
    def __init__(self, gui_log_callback=None):
        super().__init__()
        self.gui_log_callback = gui_log_callback
    
    def emit(self, record):
        """发送日志记录到GUI"""
        if self.gui_log_callback:
            try:
                msg = self.format(record)
                self.gui_log_callback(msg)
            except Exception:
                pass  # 避免日志处理中的异常影响主程序

class Logger:
    """日志管理类"""
    
    def __init__(self, name="AutoGUI", gui_log_callback=None):
        self.name = name
        self.logger = None
        self.gui_log_callback = gui_log_callback
        self.setup_logger()
    
    def setup_logger(self):
        """设置日志器"""
        # 创建日志文件夹
        log_folder = os.path.join(BASE_DIR, LOG_SETTINGS['folder'])
        if not os.path.exists(log_folder):
            os.makedirs(log_folder)
        
        # 创建日志器
        self.logger = logging.getLogger(self.name)
        self.logger.setLevel(logging.INFO)
        
        # 清除已有的处理器
        self.logger.handlers.clear()
        
        # 创建文件处理器（带轮转）
        log_file = os.path.join(log_folder, f"{self.name}_{datetime.now().strftime('%Y%m%d')}.log")
        file_handler = logging.handlers.RotatingFileHandler(
            log_file,
            maxBytes=LOG_SETTINGS['max_size_mb'] * 1024 * 1024,
            backupCount=LOG_SETTINGS['max_files'],
            encoding='utf-8-sig',  # 使用UTF-8 BOM编码
            errors='replace'  # 处理编码错误
        )
        
        # 创建控制台处理器
        console_handler = logging.StreamHandler()
        # 设置控制台输出编码
        if hasattr(console_handler.stream, 'reconfigure'):
            try:
                console_handler.stream.reconfigure(encoding='utf-8')
            except:
                pass
        
        # 设置控制台处理器的编码
        console_handler.setLevel(logging.INFO)
        
        # 创建GUI处理器
        gui_handler = GUILogHandler(self.gui_log_callback)
        
        # 设置格式
        formatter = logging.Formatter(
            LOG_SETTINGS['format'],
            datefmt=LOG_SETTINGS['date_format']
        )
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        gui_handler.setFormatter(formatter)
        
        # 添加处理器
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
        self.logger.addHandler(gui_handler)
    
    def set_gui_callback(self, callback):
        """设置GUI日志回调函数"""
        self.gui_log_callback = callback
        # 重新设置日志器以更新GUI处理器
        self.setup_logger()
    
    def info(self, message):
        """记录信息日志"""
        self.logger.info(message)
    
    def warning(self, message):
        """记录警告日志"""
        self.logger.warning(message)
    
    def error(self, message):
        """记录错误日志"""
        self.logger.error(message)
    
    def debug(self, message):
        """记录调试日志"""
        self.logger.debug(message)

# 创建全局日志器实例
logger = Logger()
